/**
 * 项目名：admin
 * 包名：com.xuebang.admin.controller
 * 文件名：ColumnController.java
 * 版本信息：@version 1.0
 * 日期：2014-2-11-下午1:25:48
 */
package com.xuebang.admin.controller;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.xuebang.admin.entity.MenuColumn;
import com.xuebang.admin.entity.OperatorRules;
import com.xuebang.admin.service.ColumnService;
import com.xuebang.admin.util.JsonUtil;
import com.xuebang.admin.web.Result;

/**
 * 项目名称：admin
 * 类名称：ColumnController
 * 类描述：
 * 创建人：xuyang
 * 创建时间：2014-2-11 下午1:25:48
 * 修改人：xuyang
 * 修改时间：2014-2-11 下午1:25:48
 * 修改备注：
 * @version 
 */
@Controller
@RequestMapping("/column")
public class ColumnController extends BaseController {
	
	/** 栏目业务逻辑类  */
	@Inject 
	ColumnService columnService;
	
	/** 首頁獲取欄目  */
	List<MenuColumn> lstAllColumns = new ArrayList<MenuColumn>();
	List<MenuColumn> lstParentColumns = new ArrayList<MenuColumn>();
	
	/**
	 * 展示所有 的欄目
	 */
	@RequestMapping(value="/operate")
	public String operate(){
		
		//20140213 权限处理  add by xy start...
		if(!this.hasPerm(OperatorRules.PERM_COLUMN)){
			return this.no_perm_page();
		}

		return "/column/operate";
	}
	
	/**
	 * 展示所有 的欄目
	 */
	@RequestMapping(value="/showColumns")
	public String showColumns(Model model){

		List<MenuColumn> lstMenuColumns = columnService.loadFstColumns(false);

		// 清空
		lstAllColumns.clear();
		lstParentColumns.clear();
		if(lstMenuColumns!=null&&lstMenuColumns.size()!=0){
			for(MenuColumn menuColumn : lstMenuColumns) {
				iniRelatedColumns(0,menuColumn);
			}
		}
		model.addAttribute("lstColumns", lstAllColumns);
		model.addAttribute("lstParentColumns", lstParentColumns);
		return "/column/showColumns";
	}
	
	/**
	 * 跳转到增加新栏目页面
	 */
	@RequestMapping(value="/add")
	public String add(@Valid MenuColumn menuColumn,Model model){

		if(!this.hasPerm(OperatorRules.PERM_COLUMN)){
			return this.no_perm_page();
		}

		model.addAttribute("menuColumn",menuColumn);
		return "/column/add";
	}
	
	/**
	 * 跳转到增加新栏目页面
	 */
	@RequestMapping(value="/update")
	public String update(Integer intColumnID,Model model){

		if(!this.hasPerm(OperatorRules.PERM_COLUMN)){
			return this.no_perm_page();
		}

		MenuColumn menuColumn = this.columnService.loadColumn(intColumnID, false);
		if(menuColumn==null){
			menuColumn = new MenuColumn();
		}
		model.addAttribute("menuColumn",menuColumn);
		return "/column/update";
	}
	
	/**
	 * 增加新栏目
	 * 
	 * @param 表单数据
	 */
	@RequestMapping(value="/toAdd",method = RequestMethod.POST,produces = "text/plain;charset=UTF-8")
	public @ResponseBody String toAdd(@Valid MenuColumn menuColumn,HttpServletRequest request){
		
		if(!this.hasPerm(OperatorRules.PERM_COLUMN)){
			return this.no_perm_page();
		}

		// 检查本栏目下是否重名
		StringBuilder sbErrorMessage = new StringBuilder();
		if(columnValidate(menuColumn,sbErrorMessage)){
			try{
				
				// initSortWay
				initSortWay(menuColumn);
				
				// 增加栏目
				System.out.println("添加的栏目的上级栏目：" + menuColumn.getParentId());
				this.columnService.addColumn(menuColumn);
				
				// 对此栏目的权限加入权限列表
				return JsonUtil.dump(Result.success("增加成功"));
			} catch(Exception e){
				e.printStackTrace();
				return JsonUtil.dump(Result.error("增加失败"));
			}
		} else {
			return JsonUtil.dump(Result.error(sbErrorMessage.toString()));
		}
	}
	
	/**
	 * 更新栏目
	 * 
	 * @param 表单数据
	 */
	@RequestMapping(value="/toUpdate",method = RequestMethod.POST,produces = "text/plain;charset=UTF-8")
	public @ResponseBody String toUpdate(@Valid MenuColumn menuColumn){
		
		//20140213 权限处理  add by xy start...
		if(!this.hasPerm(OperatorRules.PERM_COLUMN)){
			return this.no_perm_page();
		}
		//20140213 权限处理  add by xy start...

		// 检查本栏目下是否重名
		StringBuilder sbErrorMessage = new StringBuilder();
		if(columnValidate(menuColumn,sbErrorMessage)){
			try{
				// initSortWay
				initSortWay(menuColumn);
				// 更新栏目
				this.columnService.updateColumn(menuColumn);
				return JsonUtil.dump(Result.success("更新成功"));
			} catch(Exception e){
				e.printStackTrace();
				return JsonUtil.dump(Result.error("更新失败"));
			}
		} else {
			return JsonUtil.dump(Result.error(sbErrorMessage.toString()));
		}
	}
	
	/**
	 * 删除栏目
	 * 
	 * @param 表单数据
	 */
	@RequestMapping(value="/toDelete",method = RequestMethod.POST,produces = "text/plain;charset=UTF-8")
	public @ResponseBody String toDelete(String strColumns){

		if(!this.hasPerm(OperatorRules.PERM_COLUMN)){
			return this.no_perm_page();
		}
		if(strColumns!=null && !"".equals(strColumns.trim())) {
			try{
				// 去掉 开始和结尾的,
				if(strColumns.length()>0){
					if(strColumns.charAt(0)==','){
						strColumns = strColumns.substring(1, strColumns.length());
					}
					if(strColumns.length()>0){
						if(strColumns.charAt(strColumns.length()-1)==','){
							strColumns = strColumns.substring(0, strColumns.length()-1);
						}
						// 增加栏目
						this.columnService.deleteColumns(strColumns);
						return JsonUtil.dump(Result.success("删除成功"));
					} else {
						return JsonUtil.dump(Result.error("删除失败"));
					}
				} else {
					return JsonUtil.dump(Result.error("删除失败"));
				}
			} catch(Exception e){
				e.printStackTrace();
				return JsonUtil.dump(Result.error("删除失败"));
			}
		} else {
			return JsonUtil.dump(Result.error("删除失败"));
		}
	}
	
	/**
	 *  加载父栏目(增加栏目页面)
	 */
	@RequestMapping(value="/loadParentColumn",method=RequestMethod.GET)
	public String loadParentColumn(){
		
		return "redirect:/column/loadParentColumn/-1";
	}
	
	/**
	 *  加载父栏目(增加栏目页面)
	 */
	@SuppressWarnings("unchecked")
	@RequestMapping(value="loadParentColumn/{parentId}",method=RequestMethod.GET)
	public String loadParentColumn(@PathVariable("parentId") int intParentId,Model model){

		if(intParentId != -1){
			loadColumn(intParentId,model,false);
			List<List<MenuColumn>> lstCascade = (List<List<MenuColumn>>)model.asMap().get("lstCascade");
			if(lstCascade!=null){
				int intIndex = 0;
				for(List<MenuColumn> lstMenuColumn: lstCascade){
					// 0：无父级栏目          1：与下面栏目同级
					MenuColumn menuColumn = new MenuColumn();
					if(intIndex++ == 0) {
						menuColumn.setId(-1);
						menuColumn.setName("无父级栏目");
					} else {
						menuColumn.setId(lstMenuColumn.get(0).getParentId());
						menuColumn.setName("与下面栏目同级");
					}
					lstMenuColumn.add(0,menuColumn);
				}
			}
			model.addAttribute("lstCascade",lstCascade);
		} else {
			// 获得一级栏目
			List<MenuColumn> lstFstColumns =  columnService.loadFstColumns(false);
			// 0：无父级栏目          1：与下面栏目同级
			if(lstFstColumns != null&&lstFstColumns.size()> 0){
					MenuColumn menuColumn = new MenuColumn();
					menuColumn.setId(null);
					menuColumn.setName("无父级栏目");
					lstFstColumns.add(0, menuColumn);
			}
			List<List<MenuColumn>> lstCascade = new ArrayList<List<MenuColumn>>();
			lstCascade.add(lstFstColumns);
			model.addAttribute("lstCascade",lstCascade);
			model.addAttribute("lstChosenIndex",new ArrayList<Integer>());
			model.addAttribute("chosenSize",0);
		}
		return "/column/loadParentColumn";
	}
	
	/**
	 * 加载栏目（级联效果）(增加文章页面)
	 * 
	 */
	@RequestMapping(value="/loadColumn",method=RequestMethod.GET)
	public String loadColumn(){

		//20140213 权限处理  add by xy start...
		if(!this.hasPerm(OperatorRules.PERM_COLUMN)){
			return this.no_perm_page();
		}
		//20140213 权限处理  add by xy start...
		
		return "redirect:/column/loadColumn/0";
	}

	/**
	 * 加载栏目（级联效果）
	 */
	@RequestMapping(value="loadColumn/{cid}",method=RequestMethod.GET)
	public String loadColumn(@PathVariable("cid") int intCid,Model model){

		//20140213 权限处理  add by xy start...
		if(!this.hasPerm(OperatorRules.PERM_COLUMN)){
			return this.no_perm_page();
		}
		//20140213 权限处理  add by xy start...
		loadColumn(intCid,model,true);
		return "/column/loadColumn";
	}
	
	/**
	 * 加载栏目（级联效果）
	 */
	private void loadColumn(int intCid,Model model,boolean blnCheck){
		
		// 级联菜单
		List<List<MenuColumn>> lstCascade = new ArrayList<List<MenuColumn>>(); 
		// 选中的index
		List<Integer> lstChosenIndex = new ArrayList<Integer>();
		// 获得一级栏目
		List<MenuColumn> lstFstColumns =  columnService.loadFstColumns(blnCheck);

		if(lstFstColumns!=null && lstFstColumns.size()!=0){
			// 放入一级栏目
			lstCascade.add(lstFstColumns);
			if(intCid == 0){
				// 默认是首个栏目
				intCid = lstFstColumns.get(0).getId();
			} else {
				MenuColumn sColumn = columnService.loadColumn(intCid,blnCheck);
				if(sColumn!=null){
					lstChosenIndex.add(sColumn.getId());
					// 防止由于数据错误出现死循环
					int intLimit= 4;
					int intTimes = 0;
					while(sColumn.getParentId()!=null && intTimes++<intLimit){
						sColumn = columnService.loadColumn(sColumn.getParentId(),blnCheck);
						if(sColumn!=null) {
							lstChosenIndex.add(0,sColumn.getId());
						} else {
							break;
						}
//						System.out.println("col:" + sColumn.getId());
					}
				}
			}
			loadCascade(lstCascade,intCid,lstChosenIndex,0,blnCheck);
		}
		model.addAttribute("lstCascade",lstCascade);
		model.addAttribute("lstChosenIndex",lstChosenIndex);
		model.addAttribute("chosenSize",lstChosenIndex.size());
	}
	
	/**
	 * 改变位置
	 */
	@RequestMapping(value="changePos",method=RequestMethod.POST,produces = "text/plain;charset=UTF-8")
	public @ResponseBody String changePos(Integer cid,Integer intFlag,Integer parentId){
		
		MenuColumn menuColumn = this.columnService.loadColumn(cid, false);
		if(menuColumn!=null){
			List<MenuColumn> lstChildColumns = null;
			if(parentId==null){
				lstChildColumns = this.columnService.loadFstColumns(false);
			} else {
				lstChildColumns = this.columnService.loadChildColumns(parentId, false);
			}
			if(lstChildColumns!=null &&lstChildColumns.size()>0 ){
				if(lstChildColumns.size()>1){
					Integer intCurrentIndex = parentId;
					// 找出
					int intIndex = 0;
					for(MenuColumn tmpMenuColumn:lstChildColumns){
						if(tmpMenuColumn.getId()==cid){
							intCurrentIndex = intIndex;
							break;
						}
						intIndex ++;
					}
					Integer intDesIndex = null;
					// 上升
					if(intFlag == 0){
						if(intIndex > 0){
							intDesIndex = intCurrentIndex-1;
						}
					} else {
					// 下降
						if(intIndex < lstChildColumns.size()-1){
							intDesIndex = intCurrentIndex+1;
						}
					}
					if(intDesIndex!=null){
						try{
							Integer intTmp = lstChildColumns.get(intDesIndex).getSortWay();
							lstChildColumns.get(intDesIndex).setSortWay(lstChildColumns.get(intCurrentIndex).getSortWay());
							lstChildColumns.get(intCurrentIndex).setSortWay(intTmp);
							this.columnService.updateColumn(lstChildColumns.get(intCurrentIndex));
							this.columnService.updateColumn(lstChildColumns.get(intDesIndex));
							return JsonUtil.dump(Result.success("修改成功"));
						} catch(Exception e){
							return JsonUtil.dump(Result.error("修改失败"));
						}
					} else {
						return JsonUtil.dump(Result.error("修改成功"));
					}
				}  else {
					return JsonUtil.dump(Result.error("修改失败"));
				}
			} else {
				//ERROR
				return JsonUtil.dump(Result.error("修改失败"));
			}
		} else {
			//ERROR
			return JsonUtil.dump(Result.error("修改失败"));
		}
	}
	
	/**
	 * 搜索 
	 */
	@RequestMapping(value="searchColumn",method=RequestMethod.GET,produces = "text/plain;charset=UTF-8")
	public String searchColumn(String searchText,Model model){

		if(searchText!=null &&!"".equals(searchText.trim())){
			lstAllColumns.clear();
			List<MenuColumn> lstAllColumns = this.columnService.searchColumn(searchText.trim(),false);
			model.addAttribute("lstColumns", lstAllColumns);
		} else {
			showColumns(model);
		}
		return "/column/showColumns";
	}
	
	/**
	 * 加载级联菜单
	 * 
	 * @param lstCascade 级联菜单
	 * @param intCid 选中的栏目
	 * @param lstChosenIndex 选中的序列
	 * @param 
	 */
	private void loadCascade(List<List<MenuColumn>> lstCascade,int intCid,
			List<Integer> lstChosenIndex,int intFloor,boolean blnCheck){

		// 理论上不会超过4级
		if(intFloor >= 4){
			System.out.println("ERROR:出现死循环！");
			return;
		}

		List<MenuColumn> childColumns = null;
		if(lstChosenIndex.size()==0){
			childColumns = columnService.loadChildColumns(intCid,blnCheck);
		} else {
			// 有可能总共有4级，但是你选中的只是第一级的（lstChosenIndex装的是第一级）
			if(lstChosenIndex.size()>intFloor) {
				Integer chosenColumnIndex = lstChosenIndex.get(intFloor);
				if(chosenColumnIndex!=null) {
					childColumns = columnService.loadChildColumns(chosenColumnIndex,blnCheck);
					//System.out.println("childColumns:" + childColumns.size());
				}
			} else {
				childColumns = columnService.loadChildColumns(intCid,blnCheck);
			}
		}
		if(childColumns!=null && childColumns.size()!=0){
			lstCascade.add(childColumns);
			// 默认是首个栏目
			intCid = childColumns.get(0).getId();
			intFloor = intFloor + 1 ;
			loadCascade(lstCascade,intCid,lstChosenIndex,intFloor,blnCheck);
		}
	}
	
	/**
	 * 内容检查
	 */
	private boolean columnValidate(MenuColumn menuColumn,StringBuilder sbErrorMessage){
		
		boolean blnResult = true;
		
		if(menuColumn !=null){
			// 栏目名字不能为空
			if(menuColumn.getName()!=null && !"".equals(menuColumn.getName().trim())){
				//栏目名字不能重复
				String strResult = checkColumnName(menuColumn.getId(),menuColumn.getParentId(),menuColumn.getName());
				if(!"".equals(strResult)){
					sbErrorMessage.append(strResult);
					blnResult  = false;
				}
			} else {
				sbErrorMessage.append("标题不能为空");
				blnResult = false;
			}
		} else {
			blnResult = false;
		}
		return blnResult ;
	}
	
	/**
	 * 栏目名不能重复
	 * 
	 * @param intFlag
	 * 				Integer 判断是增加或者更新（1：更新     ！1增加）
	 */
	private String checkColumnName(Integer intCid,Integer intParentId,String strColumnName){
		
		String strResult = "";
		boolean blnSame = true;
		if(intCid!=null){
			MenuColumn menuColumn = this.columnService.loadColumn(intCid, false);
			if(menuColumn!=null){
				if(!strColumnName.equals(menuColumn.getName())){
					blnSame = false;
				}
			} else {
				strResult = "被更新的栏目出现异常";
			}
			
		} 
		if("".equals(strResult)) {
			// intCid 不为空并且 blnSame=true则不检查
			if(intCid==null || !blnSame){
				List<MenuColumn> lstMenuColumn = this.columnService.searchByNameAndPid(strColumnName,intParentId,false);
				if(lstMenuColumn!=null&&lstMenuColumn.size()>=1){
					strResult = "栏目重复";
				}
			}
		}

		return strResult;
	}
	
	/**
	 * 准备关联栏目
	 */
	private void iniRelatedColumns(int intNumFloor,MenuColumn menuColumns){

		// 防止出現死循環
		if(intNumFloor== 4){
			System.out.println("ERROR：欄目ID為" + menuColumns.getId() + "的欄目出現錯誤！");
			return;
		}
		List<MenuColumn> lstTempMenuColumns = columnService.loadChildColumns(menuColumns.getId(),false);
		MenuColumn clonMenuColumn = new MenuColumn();
		try{
			BeanUtils.copyProperties(menuColumns, clonMenuColumn);
		} catch(Exception e){
			e.printStackTrace();
		}
		int i = intNumFloor;
		// title存起menuid
		String strColumnName = "";
		while(i-- > 0) {
			strColumnName += "|---";
		}
		strColumnName += menuColumns.getName();
		menuColumns.setName(strColumnName);
		lstAllColumns.add(menuColumns);
		if(menuColumns.getParentId()==null){
			lstParentColumns.add(new MenuColumn());
		}
		if(lstTempMenuColumns != null && lstTempMenuColumns.size() != 0) {
			intNumFloor++;
			for(MenuColumn tempMenuColumn : lstTempMenuColumns){
				lstParentColumns.add(clonMenuColumn);
				iniRelatedColumns(intNumFloor,tempMenuColumn);
			}
		}
	}
	
	/**
	 * 初始化SortWay
	 */
	private void initSortWay(MenuColumn menuColumn){

		try{
			if(menuColumn.getSortWay()==null){
				List<MenuColumn> lstMenuColumn = null;
				if(menuColumn.getParentId()!=null){
					lstMenuColumn = this.columnService.loadChildColumns(menuColumn.getParentId(), false);
				}
				// 栏目
				if(lstMenuColumn!=null&&lstMenuColumn.size()>0){
					Integer intLastSortWay = lstMenuColumn.get(lstMenuColumn.size()-1).getSortWay();
					if(intLastSortWay != null){
						menuColumn.setSortWay(intLastSortWay + 1);
					} else {
						if(menuColumn.getParentId()!=null){
							menuColumn.setSortWay(menuColumn.getParentId()*100 + lstMenuColumn.size()+1);
						}
					}
				} else if(lstMenuColumn!=null&&lstMenuColumn.size()==0){
					if(menuColumn.getParentId()!=null){
						menuColumn.setSortWay(menuColumn.getParentId()*100 + 1);
					}
				}
			}
		} catch(Exception e){
			e.printStackTrace();
		}
	}
}
